<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="box">

    </div>

    <script src="./js/react18.js"></script>
    <script src="./js/react-dom18.js"></script>
    <script src="./js/babel.min.js"></script>
    <script src="./js/prop-types.js"> </script>

    <script type="text/babel">

        // 创建一个根对象：
        let root = ReactDOM.createRoot(document.getElementById("box"));


        class MyPerson extends React.Component {

            constructor(props) {
                super();
                this.state = {
                    count:5
                }
            }

            changeCount() {
                // setState内部修改状态是异步的。
                // 1、如果想获取到最新的值。使用setState的第二个参数（回调函数）;
                //     setState内部：先合并状态，再调用render方法，然后，再调用setState的第二个参数（回调函数）
                // 2、如果想在修改状态之前，获取旧值。把setState的第一个参数变成回调函数。

                console.log("旧值1：this.state",this.state);
                this.setState((oldValue)=>{
                    console.log(this.state == oldValue);//true，但是依然建议使用参数，而不建议使用this.state的方式。
                    console.log("旧值2：oldValue",oldValue);
                    return {
                        count:this.state.count+1
                    }
                },()=>{
                    console.log("新值：this.state.count",this.state.count);
                })

            }

            render() {
                console.log("render：this.state.count",this.state.count);
                return (
                    <div>
                        <h1>状态机</h1>
                        <p>count:{this.state.count}</p>
                        <input type="button" value="修改count" onClick={() => this.changeCount()} />
                    </div>
                )
            }

        }




        const jsx = (
            <div>
                <MyPerson />
            </div>)


        // 把jsx渲染到根对象对应的dom容器里
        root.render(jsx);


    </script>
</body>

</html>